/*
 * Títutlo: PriQueueList.java
 * Autor: Diego Serafín Martínez García
 * Descripción: Estructura de Datos, "Cola" prioritaria impmentadas con Listas.
 * 
 * Universidad Autónoma de Yucatán
 * 
 */

package aerodromo.util.estructurasDatos.cola;

import aerodromo.model.Avion;
import aerodromo.util.estructurasDatos.lista.ListNode;
import aerodromo.util.estructurasDatos.lista.SimpleList;

/**
 *
 * @author jorge.reyes
 */
public class PriQueueList<T> implements PriQueue<T>{
private int contador;
private SimpleList  lista;

public PriQueueList(){
contador = 0;
lista = new SimpleList();
}

    public int size() {
        return contador;
    }

    public boolean isEmpty() {
      return lista.isEmpty();
    }

    public void insert(T item){
    Avion vuelo = (Avion)item;
    insertItem(item,vuelo.getCombustible());
    }


    public void insertItem(Object item, int k) {
    if (lista.isEmpty()){
      ListNode nodo = new ListNode(item);
      lista.setFirstNode(nodo);
      lista.setLastNode(nodo);
    }
    else{
      if (lista.getFirstNode()== lista.getLastNode()){
        if(k > ((Avion)lista.getFirstNode().getData()).getCombustible())
          lista.insertAtFirst(item);
        else
          lista.insertAtLast(item);
      }
     else{//Cuando la lista tiene mas de 1 elemento
       ListNode current = lista.getFirstNode();
       ListNode anterior = null;
       while (current != null && k <
               ((Avion)current.getData()).getCombustible()){
               anterior = current;
               current = current.getSiguiente();
       }
       if (anterior == null)
           lista.insertAtFirst(item);
       else
           if (anterior == lista.getLastNode())
               lista.insertAtLast(item);
           else
           {
           ListNode nuevo = new ListNode(item);
           anterior.setSiguiente(nuevo);
           nuevo.setSiguiente(current);
           }
     }

    }
    contador++;
    }

    public T minElem() throws PriQueueEmptyException {
        return (T)lista.getLastNode().getData();
    }

    public T removeMinElem() throws PriQueueEmptyException {
        contador--;
        return (T)lista.removeFromLast();
    }

    public int minKey() throws PriQueueEmptyException {
       return ((Avion)lista.getLastNode().getData()).getCombustible();
    }
/*
    public static void main(String[] args) {
    PriQueueList colaPrioridad = new PriQueueList();
    Vuelo vuelo1 = new Vuelo(123,"Aviacsa",10);
    Vuelo vuelo2 = new Vuelo(23,"Mexicana",12);
    Vuelo vuelo3 = new Vuelo(2,"Aeromexico",5);
    Vuelo vuelo4 = new Vuelo(4,"Volaris",15);
    Vuelo vuelo5 = new Vuelo(45,"Intejet",2);
    colaPrioridad.insert(vuelo1);
    colaPrioridad.insert(vuelo2);
    colaPrioridad.insert(vuelo3);
    colaPrioridad.insert(vuelo4);
    colaPrioridad.insert(vuelo5);
    while (!colaPrioridad.isEmpty()){
        System.out.println("Prioridad " + colaPrioridad.minKey());
        System.out.println( "Aerolinea: " +
                ((Vuelo)colaPrioridad.removeMinElem()).getAerolinea());
    }

    }

     */


 }
